package com.benshou.bsoa.utils;


/*
 * 生成MD5工具类
 * 32位大学字母
 * 秘钥参数secret: a035c5679344403fb5b69f31cee1f704
 * 时间戳格式 年月日时分秒 时间不能高于或者低于当前时间10分钟
 * account账户 BSKJ
 * 秘钥sign=account+timestamp+secret
 */

import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

@Component
public class Md5Util {
    private final DateTimeFormatter TIMESTAMP_FORMATTER =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private final int TIME_TOLERANCE_MINUTES = 10; // 时间戳有效期 ±10 分钟

    /**
     * 生成签名入口方法
     * @param key
     *
     */
    public String generateSign(String key) {
        return md5(key).toUpperCase();
    }

    /**
     * 生成当前时间戳（格式：yyyy-MM-dd HH:mm:ss）
     */
    public String generateTimestamp() {
        return LocalDateTime.now().format(TIMESTAMP_FORMATTER);
    }

    /**
     * MD5 加密核心方法
     */
    public String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8));
            StringBuilder hexString = new StringBuilder();
            for (byte b : digest) {
                hexString.append(String.format("%02x", b)); // 直接输出小写，最后统一转大写
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5 algorithm not available", e);
        }
    }

    /**
     * 验证时间戳是否在有效期内（供外部校验使用）
     * @param timestamp 待校验的时间戳
     */
    public  boolean isTimestampValid(String timestamp) {
        try {
            LocalDateTime requestTime = LocalDateTime.parse(timestamp, TIMESTAMP_FORMATTER);
            LocalDateTime currentTime = LocalDateTime.now();
            long diff = ChronoUnit.MINUTES.between(requestTime, currentTime);
            return Math.abs(diff) <= TIME_TOLERANCE_MINUTES;
        } catch (Exception e) {
            return false; // 格式错误直接视为无效
        }
    }
}
